/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ttfsclient;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import myutil.Protocol;
import pojo.POJODownload;
import pojo.POJOFileUpload;

/**
 *
 * @author Tidus Le
 */
public class clsResponse
{
    ObjectOutputStream objOutStr;

    public clsResponse(OutputStream outStr)
    {
        try
        {
            objOutStr=new ObjectOutputStream(outStr);
        }catch(Exception e)
        {
            e.printStackTrace();
        }
    }
    
    /**
     * Nếu như chưa có đủ số package thì send package được yêu cầu ở trong thư mục temp
     */
    private void sendPackage(String fid,int stt)
    {
        Protocol prot=new Protocol();
        prot.setSp(true);
        prot.setFid(fid);
        prot.setStt(stt);
        
        try
        {
            File tempDir=new File(frmMain.tempDir+fid);
            File[] listFile=tempDir.listFiles();
            
            //Lấy đường dẫn chính xác của package được yêu cầu
            String p="";
            for(File f:listFile)
            {
                String fname=f.getName();
                try
                {
                    int number=Integer.parseInt(fname.substring(fname.lastIndexOf(".")+1, fname.length()));
                    if(number==stt)
                    {
                        p=f.getAbsolutePath();
                        break;
                    }
                }catch(Exception ex)
                {
                    System.out.println(ex.getMessage());
                }
            }
            
            //Get nội dung vào buffer
            File file=new File(p);
            FileInputStream fInStr=new FileInputStream(file);
            int contentLength=(int)file.length();
            byte[] content=new byte[contentLength];
            BufferedInputStream buffInStr=new BufferedInputStream(fInStr);
            buffInStr.read(content, 0, contentLength);
            
            //set vào protocol
            prot.setLen(contentLength);
            prot.setData(content);
            
            //close
            fInStr.close();
            buffInStr.close();
        }catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
        
        //Gửi response
        try
        {
            objOutStr.writeObject(prot);
            objOutStr.flush();
        }catch(Exception ex)
        {
            System.out.println(ex.getMessage());
        }
    }
    
    private void sendPackageFull(String fid,int stt)
    {
        String fpath="";
        for(POJOFileUpload fu:frmMain.arrFileUpload)
            if(fu.getFid().equals(fid)==true)
            {
                //Nếu có full file
                fpath=fu.getPath();
                break;
            }
        
        //Nếu như không full file thì kiểm tra xem có đang download hay không
        if(fpath.isEmpty()==true)
        {
            for(POJODownload fu:frmMain.arrDownload)
                if((fu.getFid().equals(fid)==true)&&(fu.getStatus().equals("finish")==false))
                {
                    //Nếu có trong đang download
                    sendPackage(fid, stt);
                    return;
                }
        }
        
        Protocol prot=new Protocol();
        prot.setSp(true);
        prot.setFid(fid);
        prot.setStt(stt);
        if(fpath.isEmpty()==true)
            prot.setOff(true); //Không có dữ liệu, tức là không còn chia sẻ file này nữa
        else
        {
            try
            {
                File file=new File(fpath);
                FileInputStream fInStr=new FileInputStream(file);
                int contentLength=(int)file.length();
                int maxData=(int)frmMain.maxData;
                byte[] content=new byte[maxData];
                int len=maxData;
                
                BufferedInputStream buffInStr=new BufferedInputStream(fInStr);
                int sum=0;
                for(int i=1;i<=stt;i++)
                {
                    if(contentLength-sum>maxData)
                    {
                        len=maxData;
                        sum+=buffInStr.read(content, 0, maxData);
                    }
                    else
                    {
                        len=contentLength-sum;
                        sum+=buffInStr.read(content, 0, contentLength-sum);
                    }
                }
                
                prot.setLen(len);
                prot.setData(content);
                
                //close
                fInStr.close();
                buffInStr.close();
            }catch(Exception ex)
            {
                System.out.println(ex.getMessage());
            }
        }
        
        try
        {
            objOutStr.writeObject(prot);
            objOutStr.flush();
        }catch(Exception ex)
        {
            System.out.println(ex.getMessage());
        }
    }
    
    /**
     * Gửi thông tin số lượng package đang có
     */
    private void sendPackageList(String fid)
    {
        Protocol prot=new Protocol();
        prot.setRp(true);
        prot.setFid(fid);
        prot.setFp(false);
        
        for(POJOFileUpload fu:frmMain.arrFileUpload)
            if(fu.getFid().equals(fid)==true)
            {
                //Nếu có full file
                prot.setFp(true);
                break;
            }
        
        //Nếu không phải file full
        if(prot.isFp()==false)
        {
            for(POJODownload fu:frmMain.arrDownload)
                if(fu.getFid().equals(fid)==true)
                {
                    //Lấy danh sách các package đang có
                    String list="";
                    File tempDir=new File(frmMain.tempDir+fid);
                    File[] listFile=tempDir.listFiles();

                    for(File f:listFile)
                    {
                        String fname=f.getName();
                        try
                        {
                            int number=Integer.parseInt(fname.substring(fname.lastIndexOf(".")+1, fname.length()));
                            list+=number+",";
                        }catch(Exception ex)
                        {
                            System.out.println(ex.getMessage());
                        }
                    }
                    
                    //set list
                    prot.setId(list);
                    break;
                }
        }
        
        //Gửi response
        try
        {
            objOutStr.writeObject(prot);
            objOutStr.flush();
        }catch(Exception ex)
        {
            System.out.println(ex.getMessage());
        }
    }
    
    /**
     * xử lý và tách thông tin từ protocol
     */
    public void process(Protocol prot)
    {
        if(prot.isSp()==true)
        {
            sendPackageFull(prot.getFid(), prot.getStt());
        }
        else
            if(prot.isRp()==true)
            {
                sendPackageList(prot.getFid());
            }
    }
}
